package service

import (
	"app/internal/api/chat/entity"
	"app/library/pipeline"
	"app/pkg/ai"
	"fmt"
	"github.com/gin-gonic/gin"
)

func NewChatAiService() *ChatAiService {
	return &ChatAiService{}
}

type ChatAiService struct {
}

// 流式响应的聊天补全
func (s ChatAiService) StreamComplete(ctx *gin.Context, req *entity.ChatStreamRequest) error {
	p := pipeline.New[*entity.ChatStreamRequest]()

	openai := ai.NewOpenaiOfficial("aaaaaaaaaaa", "bbbbbbbb", "ccccccccc") //openai官方的
	//openai = ai.NewOpenaiAuzre("aaaaaaaaaaa", "bbbbbbbb", "ccccccccc") //微软的openai
	//定义业务中需要穿过的中间件
	pips := []pipeline.Middleware[*entity.ChatStreamRequest]{
		s.checkUser(10),                        // TODO 从配置获取
		s.textModeration(true),                 // TODO 从配置获取
		s.useInstruction("你扮演一位全能助手"), // TODO 从配置获取
		s.chatWithAi(openai),                   // 选择一位ai来聊天，可以切换不同的AI来提供服务
		s.recordChatLog(),                      //记录聊天日志
	}
	//执行
	return p.Send(ctx, req).Through(pips...).Then(func(ctx *gin.Context, payload *entity.ChatStreamRequest) error {
		//TODO 做点什么 if you want
		fmt.Println(payload.Result) //输入聊天内容
		return nil
	})
}

// 用户可用次数检查
func (s ChatAiService) checkUser(times int) pipeline.Middleware[*entity.ChatStreamRequest] {
	return func(c *gin.Context, r *entity.ChatStreamRequest) error {
		//TODO VIP 不限次数，普通用户用户每天只有有限的次数
		return r.Error
	}
}

// 文本审核
func (s ChatAiService) textModeration(should bool) pipeline.Middleware[*entity.ChatStreamRequest] {
	return func(c *gin.Context, r *entity.ChatStreamRequest) error {
		//TODO 用户输入内容的审核
		return r.Error
	}
}

// 设置默认的指令
func (s ChatAiService) useInstruction(d string) pipeline.Middleware[*entity.ChatStreamRequest] {
	return func(c *gin.Context, r *entity.ChatStreamRequest) error {
		//TODO 从用户选择的场景查询场景指令，如果没有就使用默认的
		return r.Error
	}
}

// 发消息给ai进行聊天
func (s ChatAiService) chatWithAi(ai ai.IChatAi) pipeline.Middleware[*entity.ChatStreamRequest] {
	return func(c *gin.Context, r *entity.ChatStreamRequest) error {
		r.Result, r.Error = ai.Chat(c, r.Request.Conversation)
		return r.Error
	}
}

// 聊天记录写入日志
func (s ChatAiService) recordChatLog() pipeline.Middleware[*entity.ChatStreamRequest] {
	return func(c *gin.Context, r *entity.ChatStreamRequest) error {
		//TODO 聊天记录到日志中
		return r.Error
	}
}
